#ifndef CCONTROL_H
#define CCONTROL_H

#include <QObject>
#include <QThread>
#include <QDebug>

#include <sys/time.h>
#include <unistd.h>

#include "cball.h"
#include "cchecked.h"
#include "calgorithm.h"
#include "dbglobal.h"

class CControl : public QObject
{
    Q_OBJECT
public:
    explicit CControl(QObject *parent = 0);

    // 重新初始化
    void reset(int startBallCnt, int nextBallCnt,
               int ballTypeCnt, int leastDestoyCnt,
               int width, int height);

    // 下一步生成
    bool NextStep();

    // 随机生成小球
    bool CreaterBall(int nextBallCnt, QList<CBall *> &newBallList);

    // 移动小球
    bool MoveBall(QPoint sourPoint, QPoint destPoint);

    // 获取尺寸
    void GetSize(int &widget, int &height);

    // 获取小球
    bool GetBall(CBall* &pBall, int x, int y);

    // 选中某一个格子
    void SelectChecked(int x, int y);

signals:
    // 更新分数
    void updateScore(int score);

    // 需要移动小球
    void BallHasMoved(QStack < QPoint > MovePath);

    // 创建了新的小球
    void CreatedNewBall(QList < CBall > newBall);

public slots:


private:
    // 初始化
    void ClearPreState();

    // 获取小球的路径
    bool GetPath(QPoint sourPoint, QPoint destPoint);

    // 遍历 矩阵 计算得分
    int CalScoreAndDisBall(QList<QPoint> destroyBall);

    // 输出矩阵 debug 使用
    void OutputMatrix();

    // 通过坐标 转换成 矩阵索引的值
    int CoordinateToIdx(QPoint point);

    // 通过坐标 转换成 矩阵索引的值
    int CoordinateToIdx(int x, int y);

    // 统计可以消除的小球的数量
    QList <QPoint> NumberOfStatisticalDestroyBalls();

    // 归还空间
    void RestoreSpace(QList<QPoint> pointlist);

    QList<QPoint> GetSpaceChecked();

    void CalALineDestoryBallCnt(int x, int y, int &curBallType, QList <QPoint> &curDestroyPoint, QList <QPoint> &totalDestroyBall);

private:
    // 棋盘矩阵 现在使用一维数据表征
    CChecked **m_CheckedMatrix;
    //QList <CChecked> m_CheckedMatrix;

    // 矩阵的尺寸
    int m_MatrixWidth, m_MatrixHeight;

    // 当前的得分
    int m_score;

    // 最少的消除的个数
    int m_LeastDestoyCnt;

    // 小球移动的路径
    QStack < QPoint > m_MovePath;

    // 余下的空的格子的位置
    //QList < QPoint > m_LastSpace;

    // 所有的小球的列表
    QList < CBall *> m_BallList;

    // 新生成的 按时还没有加入小球列表的小球
    QList < CBall* > m_NewBallList;

    // 选中的小球的坐标
    QPoint m_CheckedBallCoordinate;

    // 下一步中生成的小球的数量
    int m_NextBallCnt;

    // 小球的种类计数
    int m_BallTypeCnt;

    // 算法类
    CAlgorithm m_CAlgorithm;
};


#endif // CCONTROL_H
